"""
https://leetcode.cn/problems/spiral-matrix/description/

54. 螺旋矩阵
已解答
中等
相关标签
相关企业
提示
给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。

 

示例 1：


输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出：[1,2,3,6,9,8,7,4,5]
示例 2：


输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出：[1,2,3,4,8,12,11,10,9,5,6,7]
 

提示：

m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100

"""

from typing import List


class Solution:

    def change_dirc(self,c):
        if c=='r':
            return 'd'
        elif c=='d':
            return 'l'
        elif c=='l':
            return 'u'
        else :
            return 'r'

    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        min_row=min_col = 0
        max_row=len(matrix)-1
        max_col=len(matrix[0])-1

        in_scop=lambda r,c:min_row<=r<=max_row and min_col<=c<=max_col

        dirc='r'
        r=c=0
        res=[matrix[0][0]]
        while min_row!=max_row+1 and min_col!=max_col+1:
            if dirc=='r':
                if in_scop(r,c+1):
                    c+=1
                    res.append(matrix[r][c])
                else:
                    min_row+=1
                    dirc=self.change_dirc(dirc)
            elif dirc=='d':
                if in_scop(r+1,c):
                    r+=1
                    res.append(matrix[r][c])
                else:
                    max_col-=1
                    dirc=self.change_dirc(dirc)
            elif dirc=='l':
                if in_scop(r,c-1):
                    c-=1
                    res.append(matrix[r][c])
                else:
                    max_row-=1
                    dirc=self.change_dirc(dirc)
            else:
                if in_scop(r-1,c):
                    r-=1
                    res.append(matrix[r][c])
                else:
                    min_col+=1
                    dirc=self.change_dirc(dirc)

        return res


if __name__=='__main__':
    sol=Solution()
    matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
    print(sol.spiralOrder(matrix))